package com.h.extensions.config;

import com.h.extensions.constant.Constants;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 死信队列
 */
@Configuration
public class DLConfig {
    // 正常的队列的信息的定义
//    @Bean("normalQueue")
//    public Queue normalQueue() {
//        return QueueBuilder.durable(Constants.NORMAL_QUEUE)
//                .deadLetterExchange(Constants.DL_EXCHANGE)  // 这个是这个正常队列和死信队列关联的交换机
//                .deadLetterRoutingKey("dlx") // 这个就是 和死信队列的交换机绑定传输的 RoutingKey
//                .ttl(10000) // 这个就是正常信息传输之后，超过10s后没有进行处理的话，就会传入到死信队列中
//                .maxLength(10) // 这个是正常队列所能接收的最大长度，超过这个长度后 后面的值都需要放入死信队列
//                .build();
//    }

    //演示TTL+死信队列模拟的延迟队列存在问题
    @Bean("normalQueue")
    public Queue normalQueue() {
        return QueueBuilder.durable(Constants.NORMAL_QUEUE)
                .deadLetterExchange(Constants.DL_EXCHANGE)  // 这个是这个正常队列和死信队列关联的交换机
                .deadLetterRoutingKey("dlx") // 这个就是 和死信队列的交换机绑定传输的 RoutingKey
                .build();
    }
    @Bean("normalExchange")
    public DirectExchange normalExchange() {
        return ExchangeBuilder.directExchange(Constants.NORMAL_EXCHANGE).build();
    }
    @Bean("normalBinding")
    public Binding normalBinding(@Qualifier("normalExchange") Exchange exchange,
                                 @Qualifier("normalQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with("normal").noargs();
    }

    // 死信队列
    @Bean("dlQueue")
    public Queue dlQueue() {
        return QueueBuilder.durable(Constants.DL_QUEUE).build();
    }
    @Bean("dlExchange")
    public DirectExchange dlExchange() {
        return ExchangeBuilder.directExchange(Constants.DL_EXCHANGE).build();
    }
    @Bean("dlBinding")
    public Binding dlBinding(@Qualifier("dlExchange") Exchange exchange,
                                 @Qualifier("dlQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with("dlx").noargs();
    }

}
